package logger

import (
	"log/slog"
	"os"
	"path/filepath"
	"runtime"

	"sina/pkg/config"
)

var Logger *slog.Logger

// InitLogger 初始化日志
func InitLogger() {
	var level slog.Level
	switch config.GlobalConfig.Log.Level {
	case "debug":
		level = slog.LevelDebug
	case "info":
		level = slog.LevelInfo
	case "warn":
		level = slog.LevelWarn
	case "error":
		level = slog.LevelError
	default:
		level = slog.LevelInfo
	}

	var handler slog.Handler
	if config.GlobalConfig.Log.Format == "json" {
		handler = slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
			Level: level,
		})
	} else {
		handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
			Level: level,
		})
	}

	Logger = slog.New(handler)
	slog.SetDefault(Logger)
}

// getCallerInfo 获取调用者信息
func getCallerInfo(skip int) (file string, line int, function string) {
	// 获取调用栈信息，跳过指定数量的函数
	pc, file, line, ok := runtime.Caller(skip)
	if !ok {
		return "unknown", 0, "unknown"
	}
	
	// 获取函数名
	fn := runtime.FuncForPC(pc)
	if fn == nil {
		return filepath.Base(file), line, "unknown"
	}
	
	// 获取相对路径的文件名
	fileName := filepath.Base(file)
	
	// 获取函数名（去掉包路径）
	funcName := fn.Name()
	if idx := filepath.Ext(funcName); idx != "" {
		funcName = funcName[:len(funcName)-len(idx)]
	}
	
	return fileName, line, funcName
}

// Debug 记录调试日志
func Debug(msg string, args ...any) {
	file, line, function := getCallerInfo(2)
	Logger.With("file", file, "line", line, "function", function).Debug(msg, args...)
}

// Info 记录信息日志
func Info(msg string, args ...any) {
	file, line, function := getCallerInfo(2)
	Logger.With("file", file, "line", line, "function", function).Info(msg, args...)
}

// Warn 记录警告日志
func Warn(msg string, args ...any) {
	file, line, function := getCallerInfo(2)
	Logger.With("file", file, "line", line, "function", function).Warn(msg, args...)
}

// Error 记录错误日志
func Error(msg string, args ...any) {
	file, line, function := getCallerInfo(2)
	Logger.With("file", file, "line", line, "function", function).Error(msg, args...)
}

// WithGroup 创建带分组的日志器
func WithGroup(name string) *slog.Logger {
	return Logger.WithGroup(name)
}

// With 创建带字段的日志器
func With(args ...any) *slog.Logger {
	return Logger.With(args...)
}
